package com.xrh.core.utils;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;

import java.util.Collection;

import com.xrh.core.exceptions.BusinessException;

/**
 * @function 断言工具
 * @author 肖荣辉
 * @date 2023年12月8日
*/
public class XAssert {

    /**
     * 断言值为false
     *
     * @param expValue 表达式的值
     * @param code     断言失败抛出异常码
     * @param message  断言失败抛出异常消息
     */
    public static void isFalse(boolean expValue, Long code, String message) {
        isTrue(!expValue, code, message);
    }

    /**
     * 断言为空
     *
     * @param object  目标
     * @param code    断言失败抛出异常码
     * @param message 断言失败抛出异常消息
     */
    public static void isNull(Object object, Long code, String message) {
        isTrue(object == null, code, message);
    }

    /**
     * 断言为空
     *
     * @param object  目标
     * @param message 断言失败抛出异常消息
     */
    public static void isNull(Object object, String message) {
        isTrue(object == null, message);
    }

    /**
     * 断言为空
     *
     * @param object 目标
     * @param e      抛出的异常
     */
    public static void isNull(Object object, RuntimeException e) {
        isTrue(object == null, e);
    }


    /**
     * 断言非空
     *
     * @param object  目标
     * @param code    断言失败抛出异常码
     * @param message 断言失败抛出异常消息
     */
    public static void notNull(Object object, Long code, String message) {
        isTrue(object != null, code, message);
    }

    /**
     * 断言非空
     *
     * @param object  目标
     * @param message 断言失败抛出异常消息
     */
    public static void notNull(Object object, String message) {
        isTrue(object != null, message);
    }

    /**
     * 断言非空
     *
     * @param object 目标
     * @param e      抛出的异常
     */
    public static void notNull(Object object, RuntimeException e) {
        isTrue(object != null, e);
    }


    /**
     * 断言非空白字符
     *
     * @param object  目标
     * @param code    断言失败抛出异常码
     * @param message 断言失败抛出异常消息
     */
    public static void notBlank(String object, Long code, String message) {
        isTrue(StrUtil.isNotBlank(object), code, message);
    }

    /**
     * 断言非空白字符
     *
     * @param object  目标
     * @param message 断言失败抛出异常消息
     */
    public static void notBlank(String object, String message) {
        isTrue(StrUtil.isNotBlank(object), message);
    }

    /**
     * 断言非空白字符
     *
     * @param object 目标
     * @param e      抛出的异常
     */
    public static void notBlank(String object, RuntimeException e) {
        isTrue(StrUtil.isNotBlank(object), e);
    }

    /**
     * 断言值为true
     *
     * @param expValue 表达式的值
     * @param code     断言失败抛出异常码
     * @param message  断言失败抛出异常消息
     */
    public static void isTrue(boolean expValue, Long code, String message) {
        if (!expValue) {
            throw new BusinessException(code, message);
        }
    }

    /**
     * 断言值为true
     *
     * @param expValue 表达式的值
     * @param message  断言失败抛出异常消息
     */
    public static void isTrue(boolean expValue, String message) {
        if (!expValue) {
            throw new BusinessException(message);
        }
    }

    /**
     * 断言值为true
     *
     * @param expValue 表达式的值
     * @param e        抛出的异常
     */
    public static void isTrue(boolean expValue, RuntimeException e) {
        if (!expValue) {
            throw e;
        }
    }

    /**
     * 断言集合非空
     *
     * @param coll    集合
     * @param code    断言失败抛出异常码
     * @param message 断言失败抛出异常消息
     */
    public static <T> void notEmpty(Collection<T> coll, Long code, String message) {
        if (CollUtil.isEmpty(coll)) {
            throw new BusinessException(code, message);
        }
    }

    /**
     * 断言集合非空
     *
     * @param coll    集合
     * @param message 断言失败抛出异常消息
     */
    public static <T> void notEmpty(Collection<T> coll, String message) {
        if (CollUtil.isEmpty(coll)) {
            throw new BusinessException(message);
        }
    }

    /**
     * 断言集合非空
     *
     * @param coll 集合
     * @param e    抛出的异常
     */
    public static <T> void notEmpty(Collection<T> coll, RuntimeException e) {
        if (CollUtil.isEmpty(coll)) {
            throw e;
        }
    }

}
